	package interfazNonograma;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import nonograma.Nonograma;

public class Interfaz extends JFrame implements ActionListener {
	
	private JFrame F;
	
	private JMenuItem ayuda;
	private JMenuItem cuadrado;
	private JMenuItem triangulo;
	private JMenuItem cara;
	private JMenuItem nuevo;
	private JMenuItem guardar;
	private JMenuItem inverso;
	private JMenuItem primera;
	private JMenuItem siguiente;
	
	private int nFilas;
	private int nColumnas;
	private Nonograma nonograma;
	private JMenuItem abrir;
	

	
	private static java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
	
	public Interfaz(){
		F= this;		
		this.setTitle("NONOGRAMA");
		F.setEnabled(true);
		F.setVisible(true);
//		canvas = new TableroCanvas(0,0);
		int x = screenSize.width/2 -250;
		int y = screenSize.height/2 -200;
		F.setBounds(x,y,500,400);
		F.setJMenuBar(dameBarraMenu());
		F.setDefaultCloseOperation(EXIT_ON_CLOSE);
		nonograma = new Nonograma(0,0);
		this.addWindowListener(
				new WindowAdapter(){
					public void windowClosing(WindowEvent e){
						System.exit(0);
					}
				});
	}
	
	public static void main (String[] args){
		Interfaz f= new Interfaz();
	};

	private void inicializarInterfaz() {
		F= new JFrame();		
		F.setTitle("NONOGRAMA");
		F.setEnabled(true);
		JPanel pt= new JPanel();
		pt.setLayout(new BorderLayout());
		nonograma = new Nonograma(nFilas,nColumnas);
//		System.out.println("Filas "+nFilas+" Columnas "+nColumnas);
		int w = (nColumnas+nonograma.getMaxFilas())*TableroCanvas.getTamcelda()+3*TableroCanvas.getD()+50;
		int h = (nFilas+nonograma.getMaxCol())*TableroCanvas.getTamcelda()+3*TableroCanvas.getD()+100;
		F.setSize(w, h);
//		System.out.println("Retricciones f "+canvas.getmaxFilas()+" Restricciones c "+canvas.getmaxCol());
//		System.out.println("tamaÃ¯Â¿Â½o celda "+TableroCanvas.getTamcelda());
		int x = screenSize.width/2 -(w/2);
		int y = screenSize.height/2 -(h/2);
//		System.out.println("width "+w+" height "+h);
		F.setBounds(x,y,w,h);
		pt.add("Center",nonograma.getCanvas());
		F.setJMenuBar(dameBarraMenu());
		F.setContentPane(pt);
		F.setVisible(true);
		F.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	

	private JMenuBar dameBarraMenu() {
		JMenuBar barra = new JMenuBar();
		barra.add(getMenuFichero());
		barra.add(getMenuNonograma());
		ayuda = getItem("Ayuda");
		ayuda.addActionListener(this);
		barra.add(ayuda);
		return barra;
	}

	
	private JMenu getMenuFichero() {
		JMenu fichero = new JMenu("Fichero");
		fichero.add(getMenuEjemplo());
		nuevo = getItem("Nuevo");
		abrir = getItem("Abrir");
		guardar = getItem("Guardar");
		fichero.add(abrir);
		fichero.add(nuevo);
		fichero.add(guardar);
		return fichero;
	}
	
	
	private JMenu getMenuEjemplo() {
		JMenu ejemplo = new JMenu("Ejemplo");
		cuadrado = getItem("Cuadrado");
		ejemplo.add(cuadrado);
		triangulo = getItem("Triangulo");
		ejemplo.add(triangulo);
		cara = getItem("Cara");
		ejemplo.add(cara);
		return  ejemplo;
	}

	private JMenu getMenuNonograma() {
		JMenu nonograma = new JMenu("Nonograma");
		inverso = getItem("Inverso");
		nonograma.add(getMenuDirecto());
		nonograma.add(inverso);
		return nonograma;
	}

	
	private JMenu getMenuDirecto() {
		JMenu directo = new JMenu("Directo");
		primera = getItem("Primera");
		siguiente = getItem("Siguiente");
		siguiente.setEnabled(false);
		directo.add(primera);
		directo.add(siguiente);
		return directo;
	}

	private JMenuItem getItem(String s){
		JMenuItem item = new JMenuItem(s);
		item.setEnabled(true);
		item.addActionListener(this);
		return item;	
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == cuadrado) {
			String nombreF = System.getProperty("user.dir")+"\\cuadrado.txt";
			leerFichero(nombreF);
			//inicializarInterfaz();
		}
		else if (e.getSource() == triangulo) {
			String nombreF = System.getProperty("user.dir")+"\\triangulo.txt";
			leerFichero(nombreF);
		}
		else if (e.getSource() == cara) {
			String nombreF = System.getProperty("user.dir")+"\\cara.txt";
			leerFichero(nombreF);
		}
		else if (e.getSource() == nuevo) {
			JPanel panel = new JPanel();
			panel.setLayout(new GridLayout(2,2));
			JLabel labelF = new JLabel("Filas");
			JLabel labelC = new JLabel("Columnas");
			JTextField tFilas = new JTextField();
			JTextField tColumnas = new JTextField();
			panel.add(labelF);
			panel.add(tFilas);
			panel.add(labelC);
			panel.add(tColumnas);
			if(JOptionPane.showConfirmDialog(null,panel,"introduzca datos",JOptionPane.OK_CANCEL_OPTION,
					JOptionPane.PLAIN_MESSAGE)== JOptionPane.OK_OPTION) {
				setnFilas(Integer.parseInt(tFilas.getText()));
				setnColumnas(Integer.parseInt(tColumnas.getText()));
				F.dispose();
				inicializarInterfaz();
				nonograma.setModoNuevo(true);
			}
				
		}
		else if (e.getSource() == abrir) {
			nonograma.setModoNuevo(false);
			nonograma.setModoInverso(false);
			try {
				JFileChooser fichero = new JFileChooser();
				fichero.showOpenDialog(Interfaz.this);
				if (fichero.getSelectedFile() != null) {
					String nombreF = fichero.getSelectedFile().getAbsolutePath();
					leerFichero(nombreF);
				}	
			}
			catch(Exception ex) {
				JOptionPane.showMessageDialog(null, "Error al leer el fichero");
			}
		}
		else if (e.getSource() == guardar) {
			String s = JOptionPane.showInputDialog("Guardar como ");
			File file = null;
			PrintWriter pw = null;
			FileWriter fw = null;
			try{
				file = new File(System.getProperty("user.dir")+"\\"+s);
				fw = new FileWriter(file);
				pw = new PrintWriter(fw);
				int j = 0;
				int f = nonograma.getFilas();
				int c = nonograma.getColumnas();
				int max = nonograma.getMaxFilas();
				int[][] restriccion = nonograma.getRF();
				pw.println("Filas");
				for (int i=0; i<f; i++){
					j = 0;
					while (j<max && restriccion[i][j]!=0) {
						pw.print(restriccion[i][j]+"\t");
						j++;
					}
					pw.println();
				}
				max = nonograma.getMaxCol();
				restriccion = nonograma.getRC();
				pw.println("Columnas");
				for (int i=0; i<c; i++){
					j = 0;
					while (j<max && restriccion[i][j]!=0) {
						pw.print(restriccion[i][j]+"\t");
						j++;
					}
					pw.println();
				}
			}catch(FileNotFoundException ex){
				JOptionPane.showMessageDialog(null, "Fichero no encontrado:\n"+file.getAbsolutePath());
			}
			catch(Exception ex){
				ex.printStackTrace();
			}
			finally {
				try {
					if (pw !=null)
						pw.close();
		        } 
		        catch (Exception e2) {
		        	e2.printStackTrace();
		        }
		    }
		}
		else if (e.getSource() == primera) {
			nonograma.setModoNuevo(false);
			nonograma.setModoInverso(false);
			siguiente.setEnabled(true);
			if (!nonograma.soluciones())
				JOptionPane.showMessageDialog(null, "No se encuentra ninguna solución");
			nonograma.setModoInverso(true);
		}
		else if (e.getSource() == siguiente) {
			nonograma.setModoNuevo(false);
			nonograma.setModoInverso(false);
			if (!nonograma.soluciones()) 
				JOptionPane.showMessageDialog(null, "No se existen más soluciones");
			nonograma.setModoInverso(true);
		}
		
		else if (e.getSource() == inverso) {
			nonograma.setModoNuevo(false);
			nonograma.setModoInverso(true);
			nonograma.getCanvas().repaint();
		}
		else if (e.getSource() == ayuda) {
			F.dispose();
			JTabbedPane tab = new JTabbedPane();
			JTextArea acerca = new JTextArea("     Descripcion: Un Nonograma (http://en.wikipedia.org/wiki/Nonogram) es un puzzle logico que se desarrollaen un tablero de NxM.\n"+
			" En este, las casillas son de dos tipos: casillas que estan señaladas casillas que estan señaladas(representadas por un cuadrito\n"+
			" en negro) o libres (blancas en la Figura 1). En general se espera que, visto a cierta distancia, las casillas coloreadas\n"+
			" muestren un dibujo. La forma del dibujo viene determinada por una lista de valores numericos que hay en el lado izquierdo\n"+
			" y superior de la tabla, llamadas restricciones de fila y de columnas, respectivamente. Por cada fila y columna hay tantos\n"+
			" valores numericos como grupos consecutivos de casillas señaladas. Los valores en si indican la longitud de este grupo de\n"+
			" casillas en negro. Por ejemplo si en una fila o columna tenemos en el lateral los valores 4 8 3 se interpretar que hay tres\n"+
			" grupos de casillas en negro en dicha fila o columna: el primero de longitud 4, el segundo de longitud 8 y el tercero de 3,\n"+
			" y en este orden. Solucionar el juego requiere decidir donde estan dichos grupos.\n\n"+
			"      El juego es interactivo, de manera que el usuario puede pinchar con el raton las casillas del tablero para cambiar su estado.\n"+
			" Las casillas del tablero pueden tomar tres colores:\n"+
			"\t 1. inicialmente todas las casillas se muestran en gris que indica que su valor todavia es indeterminado,\n"+
			"\t 2. en negro significa que estan seÃƒÂ±aladas (u ocupadas),\n"+
			"\t 3. en blanco significa que est en libres.\n"+
			"\n  Las casillas cambian de estado cada vez que el usuario pincha sobre ellas, pasando de gris a negro en el primer click,\n"+
			" de negro a blanco en el segundo y asi sucesivamente, tantas veces como se quiera.\n");
			JTextArea inverso = new JTextArea("     Dado un dibujo marcado por el usuario, hallar la combinaci´on de valores que forman el puzzle. Estos valores se pueden\n"+
			" después guardar en �?chero a través de la opción Guardar.");
			JTextArea directo = new JTextArea("     Directo: Dados las restricciones de �?las y columnas y opcionalmente una serie de casillas seleccionadas (es decir, en color\n"+
			" blanco o negro), hallar el dibujo correspondiente (si existe). Tiene dos submenús:\n"+
			"\t ◦ Primera: Muestra la primera solución hallada.\n"+
			"\t ◦ Siguiente: Cada vez que se pulsa este menú, se muestra la siguiente solución hallada, hasta que no existan\n"+
			"\t  más, momento en el que se mostrará un mensaje “No existen más soluciones�?.");
			tab.add("Acerca",acerca);
			tab.add("Directo",directo);
			tab.add("Inverso",inverso);
			F.setContentPane(tab);
			F.setTitle("NONOGRAMA");
			F.setEnabled(true);
			int x = screenSize.width/2 -370;
			int y = screenSize.height/2 -190;
			F.setBounds(x, y, 740, 380);
			F.setVisible(true);
		}
	}

	private void leerFichero(String nombreF) {
		String[] partes; 
		File f = new File(nombreF);
		try { /**Averiguamos el tamaño del tablero**/
			Scanner sc = new Scanner(f);
			String s = sc.nextLine();
			if (s.equals("Filas")) {
				nFilas = 0;
				s = sc.nextLine();
				while (sc.hasNext() && !s.equals("Columnas")) {
						nFilas++;
						s = sc.nextLine();
				}
			}
			if (s.equals("Columnas")) {
				nColumnas = 1;
				s = sc.nextLine();
				while (sc.hasNext()) {
					nColumnas++;
					s = sc.nextLine();
				}
			sc.close();
			}
			//nonograma = new Nonograma(nFilas,nColumnas);
			F.dispose();
			inicializarInterfaz();
			sc = new Scanner(f);
			s = sc.nextLine();
			/**Creamos las restricciones de filas y columnas a partir del fichero**/
			if (s.equals("Filas")) {
				int i = 0;
				s = sc.nextLine();
				while (sc.hasNext() && !s.equals("Columnas")) {
					partes = s.split("\t");
					for(int j=0; j<partes.length; j++)
						nonograma.setElemRF(i, j, Integer.parseInt(partes[j]));
					s = sc.nextLine();
					i++;	
				}
			}
			if (s.equals("Columnas")) {
				int i = 0;
				while (sc.hasNext()) {
					s = sc.nextLine();
					partes = s.split("\t");
					for(int j=0; j<partes.length; j++)
						nonograma.setElemRC(i, j, Integer.parseInt(partes[j]));
					i++;
				}
			}
			sc.close();
		}
		catch(FileNotFoundException ex) {
			JOptionPane.showMessageDialog(null, "Fichero no encontrado:\n"+f.getAbsolutePath());
		}
		catch(Exception ex) {
			JOptionPane.showMessageDialog(null, "Error al leer el fichero");
		}
	}
		

	public int getnFilas() {
		return nFilas;
	}

	public void setnFilas(int nFilas) {
		this.nFilas = nFilas;
	}

	public int getnColumnas() {
		return nColumnas;
	}

	public void setnColumnas(int nColumnas) {
		this.nColumnas = nColumnas;
	}
}

